查看原文
其他

C语言学习之结构体

wcc149 电子电路开发学习 2021-01-31

前言

自去年毕业工作以来,C语言的学习都停留在入门阶段,实际应用中只使用到了数组、函数、循环、选择、位运算这些基本的知识,较少用到指针、预处理、结构体、枚举类型、文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言的使用,所以最近几篇文章是关于这些内容的,一方面是巩固自己的C语言编程能力,另一方面也为以后学习C++做准备。

什么是结构体

C语言的结构体实际上就是一种特殊的数据类型,只不过这种数据类型包括了很多个基本类型的数据,如int、float、char等等,如在开发学生成绩管理系统时,有学号、姓名、院系、班级、年龄、各个科目、各个科目对应的成绩等,不使用结构体我们需要定义许多的变量,而使用结构体可以大大简化程序的设计。

结构体类型的定义

结构体的定义格式为:

  1. struct 结构体名称

  2. {

  3.    结构体所包含的成员变量;

  4. }

与C++不同的是,C语言的结构体只能包括成员变量,不能包含成员函数,但可以定义函数指针指向一个函数。

定义一个名为student的结构体类型,包含id、name、score这3个成员变量。

  1. struct student

  2. {

  3.    int id;

  4.    char *name;

  5.    float score;

  6. };

定义两个student的结构体变量:

  1. struct student lucy, jack;

当然,也可以在定义结构体的同时定义结构体变量:

  1. struct student

  2. {

  3.    int id;

  4.    char *name;

  5.    float score;

  6. }lucy, jack;

即把变量名放在定义结构体的最后即可。

如果只需要定义lucy、jack两个结构体变量,后面其他地方都不需要再定义新的结构体变量,那么结构体名可以省略,不建议使用这种方式:

  1. struct

  2. {

  3.    int id;

  4.    char *name;

  5.    float score;

  6. }lucy, jack;

这种写法看起来是稍微简单了一些,但后面无法再定义新的结构体变量。

结构体变量在内存中的存储

理论上和数组元素的存储非常类似,结构体变量的存储也是连续存储的,但在实际的编译器实现过程中,各个成员变量之间可能会存在缝隙。

结构体变量

【示例】:

  1. #include "stdio.h"

  2. #include "stdlib.h"


  3. struct student

  4. {

  5.    int id;

  6.    char *name;

  7.    float score;

  8. };


  9. struct student jack;


  10. int main(void)

  11. {

  12.    //成员的赋值

  13.    jack.id = 1234;

  14.    jack.name = "jack";

  15.    jack.score = 89.5;


  16.    printf("%s id: %d, score: %.1f \r\n", jack.name, jack.id, jack.score);      


  17.    return 0;

  18. }

【输出结果】:

  1. jack id: 1234, score: 89.5

当然,也可以在定义的时候整体赋值:

  1. struct student lucy, jack = {1233, "jack", 92.6};

但不可以在定义之后,单独整体赋值;

  1. struct student lucy;

  2. lucy = {1233, "lucy", 92.6};    

这种整体赋值不允许,会报错。

结构体数组

当然也允许定义结构体数组:

  1. struct student cls[5];

定义的数组可以不指定数组大小。

【示例】:

  1. #include "stdio.h"

  2. #include "stdlib.h"


  3. struct student

  4. {

  5.    int id;

  6.    char *name;

  7.    float score;

  8. };

  9. //定义的同时整体赋值

  10. struct student cls[5] =     //也可以不给出数据大小: cls[]

  11. {

  12.    {1001, "Li Lei", 88.4},

  13.    {1002, "Zhang Wei", 79.3},

  14.    {1003, "Wang Ming", 70.8},

  15.    {1004,"Zhao Yang", 80.5},

  16.    {1005,"Li Liang", 89.5}

  17. };


  18. int main(void)

  19. {

  20.    int i;

  21.    int num_80 = 0; //分数大于80的人数

  22.    float average = 0, sum = 0;     //平均分和总和


  23.    for(i = 0; i < 5; i++)

  24.    {

  25.        sum += cls[i].score;

  26.        if(cls[i].score > 80)

  27.            num_80++;

  28.    }

  29.    average = sum / 5.0;


  30.    printf("分数大于80的人数:%d,总平均分:%.1f", num_80, average);  

  31.    return 0;

  32. }

【输出结果】:

  1. 分数大于80的人数:3,总平均分:81.7

结构体指针变量

定义格式为:

  1. struct student *p;

【示例一】:

  1. #include "stdio.h"

  2. #include "stdlib.h"


  3. struct student

  4. {

  5.    int id;

  6.    char *name;

  7.    float score;

  8. };

  9. //定义的同时整体赋值

  10. struct student *pstu, stu = {1234, "lucy", 90.4};


  11. int main(void)

  12. {

  13.    pstu = &stu;        //*pstu 等同于 stu


  14.    printf("id: %d, name: %s, score: %.1f \n", stu.id, stu.name, stu.score);

  15.    printf("id: %d, name: %s, score: %.1f \n", (*pstu).id, (*pstu).name, (*pstu).score);

  16.    printf("id: %d, name: %s, score: %.1f \n", pstu->id, pstu->name, pstu->score);  //指针变量引用成员变量


  17.    return 0;

  18. }

【输出结果】:

  1. id: 1234, name: lucy, score: 90.4

  2. id: 1234, name: lucy, score: 90.4

  3. id: 1234, name: lucy, score: 90.4

【示例二】

  1. #include "stdio.h"

  2. #include "stdlib.h"


  3. struct student

  4. {

  5.    int id;

  6.    char *name;

  7.    float score;

  8. };


  9. struct student *ps;

  10. struct student cls[] =

  11. {

  12.    {1001, "Li Lei", 88.4},

  13.    {1002, "Zhang Wei", 79.3},

  14.    {1003, "Wang Ming", 70.8},

  15.    {1004,"Zhao Yang", 80.5},

  16.    {1005,"Li Liang", 89.5}

  17. };


  18. int main(void)

  19. {

  20.    int len = sizeof(cls) / sizeof(struct student);    //求数组长度

  21.    printf("id \t name \t score \n");


  22.    for(ps = cls; ps < cls + len; ps++)

  23.    {

  24.        printf("%d \t %s \t %.1f \n", ps->id, ps->name, ps->score);

  25.    }

  26.    return 0;

  27. }

【输出结果】:

  1. id       name    score

  2. 1001     Li Lei          88.4

  3. 1002     Zhang Wei       79.3

  4. 1003     Wang Ming       70.8

  5. 1004     Zhao Yang       80.5

  6. 1005     Li Liang        89.5


参考资料:

  • C语言结构体详解:

    http://c.biancheng.net/c/100/

Jlink使用技巧系列文章:


欢迎大家关注我的个人博客

http://www.wangchaochao.top

或微信扫码关注我的公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存